ποΈGitΠ―ΡΠ°ποΈ
.github/extensions/speckit/extension.mjs feat/fts5-message-search (a54be798) Text, 11.68 KB
T8b949e// Extension: speckit
T8b949e// Spec Kit SDD workflow tools for Meshtastic Android
Tff7b72import Tb4b4b4{ Te6edf3joinSession Tb4b4b4} Tff7b72from Ta5d6ff"@github/copilot-sdk/extension"Tb4b4b4;
Tff7b72import Tb4b4b4{ Te6edf3readdirTb4b4b4, Te6edf3readFileTb4b4b4, Te6edf3stat Tb4b4b4} Tff7b72from Ta5d6ff"node:fs/promises"Tb4b4b4;
Tff7b72import Tb4b4b4{ Te6edf3joinTb4b4b4, Te6edf3basename Tb4b4b4} Tff7b72from Ta5d6ff"node:path"Tb4b4b4;
Tff7b72const Te6edf3SPECS_DIR Tff7b72= Te6edf3joinTb4b4b4(Te6edf3processTb4b4b4.Te6edf3cwdTb4b4b4(Tb4b4b4)Tb4b4b4, Ta5d6ff"specs"Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3SPECIFY_DIR Tff7b72= Te6edf3joinTb4b4b4(Te6edf3processTb4b4b4.Te6edf3cwdTb4b4b4(Tb4b4b4)Tb4b4b4, Ta5d6ff".specify"Tb4b4b4)Tb4b4b4;
Tff7b72async Tff7b72function Te6edf3dirExistsTb4b4b4(Te6edf3pTb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72return Tb4b4b4(Tff7b72await Te6edf3statTb4b4b4(Te6edf3pTb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3isDirectoryTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72async Tff7b72function Te6edf3fileExistsTb4b4b4(Te6edf3pTb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72return Tb4b4b4(Tff7b72await Te6edf3statTb4b4b4(Te6edf3pTb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3isFileTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72async Tff7b72function Te6edf3discoverSpecsTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Tb4b4b4(Tff7b72await Te6edf3dirExistsTb4b4b4(Te6edf3SPECS_DIRTb4b4b4)Tb4b4b4)Tb4b4b4) Tff7b72return Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tff7b72const Te6edf3entries Tff7b72= Tff7b72await Te6edf3readdirTb4b4b4(Te6edf3SPECS_DIRTb4b4b4, Tb4b4b4{ Te6edf3withFileTypesTff7b72: Tff7b72true Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3specs Tff7b72= Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72const Te6edf3entry Tff7b72of Te6edf3entriesTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3entryTb4b4b4.Te6edf3isDirectoryTb4b4b4(Tb4b4b4)Tb4b4b4) Tff7b72continueTb4b4b4;
Tff7b72const Te6edf3specDir Tff7b72= Te6edf3joinTb4b4b4(Te6edf3SPECS_DIRTb4b4b4, Te6edf3entryTb4b4b4.Te6edf3nameTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3specFile Tff7b72= Te6edf3joinTb4b4b4(Te6edf3specDirTb4b4b4, Ta5d6ff"spec.md"Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Tb4b4b4(Tff7b72await Te6edf3fileExistsTb4b4b4(Te6edf3specFileTb4b4b4)Tb4b4b4)Tb4b4b4) Tff7b72continueTb4b4b4;
Tff7b72const Te6edf3files Tff7b72= Tff7b72await Te6edf3readdirTb4b4b4(Te6edf3specDirTb4b4b4, Tb4b4b4{ Te6edf3withFileTypesTff7b72: Tff7b72true Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3artifacts Tff7b72= Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72const Te6edf3f Tff7b72of Te6edf3filesTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3fTb4b4b4.Te6edf3isFileTb4b4b4(Tb4b4b4)Tb4b4b4) Te6edf3artifactsTb4b4b4.Te6edf3pushTb4b4b4(Te6edf3fTb4b4b4.Te6edf3nameTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3fTb4b4b4.Te6edf3isDirectoryTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3subFiles Tff7b72= Tff7b72await Te6edf3readdirTb4b4b4(Te6edf3joinTb4b4b4(Te6edf3specDirTb4b4b4, Te6edf3fTb4b4b4.Te6edf3nameTb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72const Te6edf3sf Tff7b72of Te6edf3subFilesTb4b4b4) Te6edf3artifactsTb4b4b4.Te6edf3pushTb4b4b4(Ta5d6ff`Tffd700${Te6edf3fTb4b4b4.Te6edf3nameTffd700}Ta5d6ff/Tffd700${Te6edf3sfTffd700}Ta5d6ff`Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72const Te6edf3hasSpec Tff7b72= Te6edf3artifactsTb4b4b4.Te6edf3includesTb4b4b4(Ta5d6ff"spec.md"Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3hasPlan Tff7b72= Te6edf3artifactsTb4b4b4.Te6edf3includesTb4b4b4(Ta5d6ff"plan.md"Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3hasTasks Tff7b72= Te6edf3artifactsTb4b4b4.Te6edf3includesTb4b4b4(Ta5d6ff"tasks.md"Tb4b4b4)Tb4b4b4;
Tff7b72let Te6edf3title Tff7b72= Te6edf3entryTb4b4b4.Te6edf3nameTb4b4b4;
Tff7b72try Tb4b4b4{
Tff7b72const Te6edf3content Tff7b72= Tff7b72await Te6edf3readFileTb4b4b4(Te6edf3specFileTb4b4b4, Ta5d6ff"utf-8"Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3match Tff7b72= Te6edf3contentTb4b4b4.Te6edf3matchTb4b4b4(Ta5d6ff/^#\s+(.+)/mTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3matchTb4b4b4) Te6edf3title Tff7b72= Te6edf3matchTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4{ T8b949e/* use dir name */ Tb4b4b4}
Tff7b72let Te6edf3taskStats Tff7b72= Tff7b72nullTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3hasTasksTb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72const Te6edf3tasksContent Tff7b72= Tff7b72await Te6edf3readFileTb4b4b4(Te6edf3joinTb4b4b4(Te6edf3specDirTb4b4b4, Ta5d6ff"tasks.md"Tb4b4b4)Tb4b4b4, Ta5d6ff"utf-8"Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3taskLines Tff7b72= Te6edf3tasksContentTb4b4b4.Te6edf3matchTb4b4b4(Ta5d6ff/^[-*]\s+\[[ x]\]/gmTb4b4b4) Tff7b72|| Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tff7b72const Te6edf3done Tff7b72= Te6edf3tasksContentTb4b4b4.Te6edf3matchTb4b4b4(Ta5d6ff/^[-*]\s+\[x\]/gmiTb4b4b4) Tff7b72|| Tb4b4b4[Tb4b4b4]Tb4b4b4;
Te6edf3taskStats Tff7b72= Tb4b4b4{ Te6edf3totalTff7b72: Te6edf3taskLinesTb4b4b4.Te6edf3lengthTb4b4b4, Te6edf3doneTff7b72: Te6edf3doneTb4b4b4.Te6edf3length Tb4b4b4}Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4{ T8b949e/* skip */ Tb4b4b4}
Tb4b4b4}
Te6edf3specsTb4b4b4.Te6edf3pushTb4b4b4(Tb4b4b4{
Te6edf3idTff7b72: Te6edf3entryTb4b4b4.Te6edf3nameTb4b4b4,
Te6edf3titleTb4b4b4,
Te6edf3artifactsTb4b4b4,
Te6edf3hasSpecTb4b4b4,
Te6edf3hasPlanTb4b4b4,
Te6edf3hasTasksTb4b4b4,
Te6edf3taskStatsTb4b4b4,
Te6edf3pathTff7b72: Te6edf3specDirTb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3specsTb4b4b4.Te6edf3sortTb4b4b4(Tb4b4b4(Te6edf3aTb4b4b4, Te6edf3bTb4b4b4) Tb4b4b4=> Te6edf3aTb4b4b4.Te6edf3idTb4b4b4.Te6edf3localeCompareTb4b4b4(Te6edf3bTb4b4b4.Te6edf3idTb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3session Tff7b72= Tff7b72await Te6edf3joinSessionTb4b4b4(Tb4b4b4{
Te6edf3toolsTff7b72: Tb4b4b4[
Tb4b4b4{
Te6edf3nameTff7b72: Ta5d6ff"speckit_list"Tb4b4b4,
Te6edf3descriptionTff7b72:
Ta5d6ff"List all feature specs in the specs/ directory with their artifacts and task progress. " Tff7b72+
Ta5d6ff"Use this to discover which specs exist and their current state."Tb4b4b4,
Te6edf3parametersTff7b72: Tb4b4b4{ Te6edf3typeTff7b72: Ta5d6ff"object"Tb4b4b4, Te6edf3propertiesTff7b72: Tb4b4b4{Tb4b4b4} Tb4b4b4}Tb4b4b4,
Te6edf3skipPermissionTff7b72: Tff7b72trueTb4b4b4,
Te6edf3handlerTff7b72: Tff7b72async Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3specs Tff7b72= Tff7b72await Te6edf3discoverSpecsTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3specsTb4b4b4.Te6edf3length Tff7b72=== T79c0ff0Tb4b4b4) Tb4b4b4{
Tff7b72return Ta5d6ff"No specs found in specs/ directory. Use /speckit.specify to create one."Tb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3lines Tff7b72= Tb4b4b4[Ta5d6ff"# Feature Specs\n"Tb4b4b4]Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72const Te6edf3s Tff7b72of Te6edf3specsTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3status Tff7b72= Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3sTb4b4b4.Te6edf3hasSpecTb4b4b4) Te6edf3statusTb4b4b4.Te6edf3pushTb4b4b4(Ta5d6ff"spec β"Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3sTb4b4b4.Te6edf3hasPlanTb4b4b4) Te6edf3statusTb4b4b4.Te6edf3pushTb4b4b4(Ta5d6ff"plan β"Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3sTb4b4b4.Te6edf3hasTasksTb4b4b4) Te6edf3statusTb4b4b4.Te6edf3pushTb4b4b4(Ta5d6ff"tasks β"Tb4b4b4)Tb4b4b4;
Tff7b72let Te6edf3progress Tff7b72= Ta5d6ff""Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3sTb4b4b4.Te6edf3taskStatsTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3pct Tff7b72= Te6edf3sTb4b4b4.Te6edf3taskStatsTb4b4b4.Te6edf3total Tff7b72> T79c0ff0
Tff7b72? Tffa657MathTb4b4b4.Te6edf3roundTb4b4b4(Tb4b4b4(Te6edf3sTb4b4b4.Te6edf3taskStatsTb4b4b4.Te6edf3done Tff7b72/ Te6edf3sTb4b4b4.Te6edf3taskStatsTb4b4b4.Te6edf3totalTb4b4b4) Tff7b72* T79c0ff100Tb4b4b4)
Tff7b72: T79c0ff0Tb4b4b4;
Te6edf3progress Tff7b72= Ta5d6ff`Ta5d6ff | Tffd700${Te6edf3sTb4b4b4.Te6edf3taskStatsTb4b4b4.Te6edf3doneTffd700}Ta5d6ff/Tffd700${Te6edf3sTb4b4b4.Te6edf3taskStatsTb4b4b4.Te6edf3totalTffd700}Ta5d6ff tasks (Tffd700${Te6edf3pctTffd700}Ta5d6ff%)Ta5d6ff`Tb4b4b4;
Tb4b4b4}
Te6edf3linesTb4b4b4.Te6edf3pushTb4b4b4(Ta5d6ff`Ta5d6ff## Tffd700${Te6edf3sTb4b4b4.Te6edf3idTffd700}Ta5d6ff`Tb4b4b4)Tb4b4b4;
Te6edf3linesTb4b4b4.Te6edf3pushTb4b4b4(Ta5d6ff`Ta5d6ff**Tffd700${Te6edf3sTb4b4b4.Te6edf3titleTffd700}Ta5d6ff**Ta5d6ff`Tb4b4b4)Tb4b4b4;
Te6edf3linesTb4b4b4.Te6edf3pushTb4b4b4(Ta5d6ff`Ta5d6ffArtifacts: Tffd700${Te6edf3statusTb4b4b4.Te6edf3joinTb4b4b4(Ta5d6ff", "Tb4b4b4)Tffd700}Tffd700${Te6edf3progressTffd700}Ta5d6ff`Tb4b4b4)Tb4b4b4;
Te6edf3linesTb4b4b4.Te6edf3pushTb4b4b4(Ta5d6ff`Ta5d6ffFiles: Tffd700${Te6edf3sTb4b4b4.Te6edf3artifactsTb4b4b4.Te6edf3joinTb4b4b4(Ta5d6ff", "Tb4b4b4)Tffd700}Ta5d6ff`Tb4b4b4)Tb4b4b4;
Te6edf3linesTb4b4b4.Te6edf3pushTb4b4b4(Ta5d6ff`Ta5d6ffPath: Tffd700${Te6edf3sTb4b4b4.Te6edf3pathTffd700}Ta5d6ff\nTa5d6ff`Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72return Te6edf3linesTb4b4b4.Te6edf3joinTb4b4b4(Ta5d6ff"\n"Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4{
Te6edf3nameTff7b72: Ta5d6ff"speckit_load"Tb4b4b4,
Te6edf3descriptionTff7b72:
Ta5d6ff"Load the primary artifacts (spec.md, plan.md, tasks.md) for a specific feature spec. " Tff7b72+
Ta5d6ff"Provide the spec ID (directory name, e.g. '20260511-211823-compose-screenshot-testing') or a partial match. " Tff7b72+
Ta5d6ff"Optionally load only specific artifacts."Tb4b4b4,
Te6edf3parametersTff7b72: Tb4b4b4{
Te6edf3typeTff7b72: Ta5d6ff"object"Tb4b4b4,
Te6edf3propertiesTff7b72: Tb4b4b4{
Te6edf3spec_idTff7b72: Tb4b4b4{
Te6edf3typeTff7b72: Ta5d6ff"string"Tb4b4b4,
Te6edf3descriptionTff7b72:
Ta5d6ff"The spec directory name or partial match (e.g. '001', 'mesh-discovery', 'node-list')"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Te6edf3artifactsTff7b72: Tb4b4b4{
Te6edf3typeTff7b72: Ta5d6ff"array"Tb4b4b4,
Te6edf3itemsTff7b72: Tb4b4b4{ Te6edf3typeTff7b72: Ta5d6ff"string" Tb4b4b4}Tb4b4b4,
Te6edf3descriptionTff7b72:
Ta5d6ff"Which artifacts to load. Defaults to ['spec.md', 'plan.md', 'tasks.md']. " Tff7b72+
Ta5d6ff"Can include any file path like 'data-model.md', 'contracts/deep-links.md', etc."Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Te6edf3requiredTff7b72: Tb4b4b4[Ta5d6ff"spec_id"Tb4b4b4]Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Te6edf3skipPermissionTff7b72: Tff7b72trueTb4b4b4,
Te6edf3handlerTff7b72: Tff7b72async Tb4b4b4(Te6edf3argsTb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3specs Tff7b72= Tff7b72await Te6edf3discoverSpecsTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3query Tff7b72= Te6edf3argsTb4b4b4.Te6edf3spec_idTb4b4b4.Te6edf3toLowerCaseTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3match Tff7b72= Te6edf3specsTb4b4b4.Te6edf3findTb4b4b4(
Tb4b4b4(Te6edf3sTb4b4b4) Tb4b4b4=>
Te6edf3sTb4b4b4.Te6edf3idTb4b4b4.Te6edf3toLowerCaseTb4b4b4(Tb4b4b4) Tff7b72=== Te6edf3query Tff7b72||
Te6edf3sTb4b4b4.Te6edf3idTb4b4b4.Te6edf3toLowerCaseTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3includesTb4b4b4(Te6edf3queryTb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3matchTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3available Tff7b72= Te6edf3specsTb4b4b4.Te6edf3mapTb4b4b4(Tb4b4b4(Te6edf3sTb4b4b4) Tb4b4b4=> Te6edf3sTb4b4b4.Te6edf3idTb4b4b4)Tb4b4b4.Te6edf3joinTb4b4b4(Ta5d6ff", "Tb4b4b4)Tb4b4b4;
Tff7b72return Ta5d6ff`Ta5d6ffNo spec matching 'Tffd700${Te6edf3argsTb4b4b4.Te6edf3spec_idTffd700}Ta5d6ff'. Available: Tffd700${Te6edf3available Tff7b72|| Ta5d6ff"none"Tffd700}Ta5d6ff`Tb4b4b4;
Tb4b4b4}
Tff7b72const Te6edf3toLoad Tff7b72= Te6edf3argsTb4b4b4.Te6edf3artifacts Tff7b72|| Tb4b4b4[Ta5d6ff"spec.md"Tb4b4b4, Ta5d6ff"plan.md"Tb4b4b4, Ta5d6ff"tasks.md"Tb4b4b4]Tb4b4b4;
Tff7b72const Te6edf3results Tff7b72= Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72const Te6edf3artifact Tff7b72of Te6edf3toLoadTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3filePath Tff7b72= Te6edf3joinTb4b4b4(Te6edf3matchTb4b4b4.Te6edf3pathTb4b4b4, Te6edf3artifactTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72await Te6edf3fileExistsTb4b4b4(Te6edf3filePathTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3content Tff7b72= Tff7b72await Te6edf3readFileTb4b4b4(Te6edf3filePathTb4b4b4, Ta5d6ff"utf-8"Tb4b4b4)Tb4b4b4;
Te6edf3resultsTb4b4b4.Te6edf3pushTb4b4b4(Ta5d6ff`Ta5d6ff--- Tffd700${Te6edf3artifactTffd700}Ta5d6ff (Tffd700${Te6edf3matchTb4b4b4.Te6edf3idTffd700}Ta5d6ff) ---Ta5d6ff\nTffd700${Te6edf3contentTffd700}Ta5d6ff`Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3resultsTb4b4b4.Te6edf3pushTb4b4b4(Ta5d6ff`Ta5d6ff--- Tffd700${Te6edf3artifactTffd700}Ta5d6ff --- NOT FOUNDTa5d6ff`Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72return Te6edf3resultsTb4b4b4.Te6edf3joinTb4b4b4(Ta5d6ff"\n\n"Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4{
Te6edf3nameTff7b72: Ta5d6ff"speckit_constitution"Tb4b4b4,
Te6edf3descriptionTff7b72:
Ta5d6ff"Display the project constitution that all specs must conform to. " Tff7b72+
Ta5d6ff"The constitution defines non-negotiable principles for the Meshtastic Android project."Tb4b4b4,
Te6edf3parametersTff7b72: Tb4b4b4{ Te6edf3typeTff7b72: Ta5d6ff"object"Tb4b4b4, Te6edf3propertiesTff7b72: Tb4b4b4{Tb4b4b4} Tb4b4b4}Tb4b4b4,
Te6edf3skipPermissionTff7b72: Tff7b72trueTb4b4b4,
Te6edf3handlerTff7b72: Tff7b72async Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3constitutionPath Tff7b72= Te6edf3joinTb4b4b4(Te6edf3SPECIFY_DIRTb4b4b4, Ta5d6ff"memory"Tb4b4b4, Ta5d6ff"constitution.md"Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Tb4b4b4(Tff7b72await Te6edf3fileExistsTb4b4b4(Te6edf3constitutionPathTb4b4b4)Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Ta5d6ff"No constitution found at .specify/memory/constitution.md. Use /speckit.constitution to create one."Tb4b4b4;
Tb4b4b4}
Tff7b72return Tff7b72await Te6edf3readFileTb4b4b4(Te6edf3constitutionPathTb4b4b4, Ta5d6ff"utf-8"Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4{
Te6edf3nameTff7b72: Ta5d6ff"speckit_status"Tb4b4b4,
Te6edf3descriptionTff7b72:
Ta5d6ff"Show overall Spec Kit workflow status: specs count, constitution version, " Tff7b72+
Ta5d6ff"template availability, and readiness for each workflow stage."Tb4b4b4,
Te6edf3parametersTff7b72: Tb4b4b4{ Te6edf3typeTff7b72: Ta5d6ff"object"Tb4b4b4, Te6edf3propertiesTff7b72: Tb4b4b4{Tb4b4b4} Tb4b4b4}Tb4b4b4,
Te6edf3skipPermissionTff7b72: Tff7b72trueTb4b4b4,
Te6edf3handlerTff7b72: Tff7b72async Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3specs Tff7b72= Tff7b72await Te6edf3discoverSpecsTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3hasConstitution Tff7b72= Tff7b72await Te6edf3fileExistsTb4b4b4(Te6edf3joinTb4b4b4(Te6edf3SPECIFY_DIRTb4b4b4, Ta5d6ff"memory"Tb4b4b4, Ta5d6ff"constitution.md"Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3hasTemplates Tff7b72= Tff7b72await Te6edf3dirExistsTb4b4b4(Te6edf3joinTb4b4b4(Te6edf3SPECIFY_DIRTb4b4b4, Ta5d6ff"templates"Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3hasExtensions Tff7b72= Tff7b72await Te6edf3fileExistsTb4b4b4(Te6edf3joinTb4b4b4(Te6edf3SPECIFY_DIRTb4b4b4, Ta5d6ff"extensions.yml"Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72let Te6edf3constitutionVersion Tff7b72= Ta5d6ff"none"Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3hasConstitutionTb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72const Te6edf3content Tff7b72= Tff7b72await Te6edf3readFileTb4b4b4(
Te6edf3joinTb4b4b4(Te6edf3SPECIFY_DIRTb4b4b4, Ta5d6ff"memory"Tb4b4b4, Ta5d6ff"constitution.md"Tb4b4b4)Tb4b4b4,
Ta5d6ff"utf-8"Tb4b4b4,
Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3match Tff7b72= Te6edf3contentTb4b4b4.Te6edf3matchTb4b4b4(Ta5d6ff/\*\*Version\*\*:\s*([\d.]+)/iTb4b4b4) Tff7b72||
Te6edf3contentTb4b4b4.Te6edf3matchTb4b4b4(Ta5d6ff/version[:\s]+v?([\d.]+)/iTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3matchTb4b4b4) Te6edf3constitutionVersion Tff7b72= Ta5d6ff`Ta5d6ffvTffd700${Te6edf3matchTb4b4b4[T79c0ff1Tb4b4b4]Tffd700}Ta5d6ff`Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4{ T8b949e/* skip */ Tb4b4b4}
Tb4b4b4}
Tff7b72let Te6edf3templateList Tff7b72= Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3hasTemplatesTb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72const Te6edf3entries Tff7b72= Tff7b72await Te6edf3readdirTb4b4b4(Te6edf3joinTb4b4b4(Te6edf3SPECIFY_DIRTb4b4b4, Ta5d6ff"templates"Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3templateList Tff7b72= Te6edf3entriesTb4b4b4.Te6edf3filterTb4b4b4(Tb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4=> Te6edf3eTb4b4b4.Te6edf3endsWithTb4b4b4(Ta5d6ff".md"Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4{ T8b949e/* skip */ Tb4b4b4}
Tb4b4b4}
Tff7b72const Te6edf3lines Tff7b72= Tb4b4b4[
Ta5d6ff"# Spec Kit Status\n"Tb4b4b4,
Ta5d6ff`Ta5d6ff**Constitution:** Tffd700${Te6edf3hasConstitution Tff7b72? Ta5d6ff`Ta5d6ffβ (Tffd700${Te6edf3constitutionVersionTffd700}Ta5d6ff)Ta5d6ff` Tff7b72: Ta5d6ff"β not found"Tffd700}Ta5d6ff`Tb4b4b4,
Ta5d6ff`Ta5d6ff**Templates:** Tffd700${Te6edf3templateListTb4b4b4.Te6edf3length Tff7b72> T79c0ff0 Tff7b72? Ta5d6ff`Ta5d6ffβ (Tffd700${Te6edf3templateListTb4b4b4.Te6edf3joinTb4b4b4(Ta5d6ff", "Tb4b4b4)Tffd700}Ta5d6ff)Ta5d6ff` Tff7b72: Ta5d6ff"β none"Tffd700}Ta5d6ff`Tb4b4b4,
Ta5d6ff`Ta5d6ff**Extensions:** Tffd700${Te6edf3hasExtensions Tff7b72? Ta5d6ff"β configured" Tff7b72: Ta5d6ff"β not found"Tffd700}Ta5d6ff`Tb4b4b4,
Ta5d6ff`Ta5d6ff**Specs:** Tffd700${Te6edf3specsTb4b4b4.Te6edf3lengthTffd700}Ta5d6ff feature(s)Ta5d6ff\nTa5d6ff`Tb4b4b4,
Tb4b4b4]Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3specsTb4b4b4.Te6edf3length Tff7b72> T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3linesTb4b4b4.Te6edf3pushTb4b4b4(Ta5d6ff"| Spec | Spec.md | Plan.md | Tasks.md | Progress |"Tb4b4b4)Tb4b4b4;
Te6edf3linesTb4b4b4.Te6edf3pushTb4b4b4(Ta5d6ff"|------|---------|---------|----------|----------|"Tb4b4b4)Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72const Te6edf3s Tff7b72of Te6edf3specsTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3progress Tff7b72= Te6edf3sTb4b4b4.Te6edf3taskStats
Tff7b72? Ta5d6ff`Tffd700${Te6edf3sTb4b4b4.Te6edf3taskStatsTb4b4b4.Te6edf3doneTffd700}Ta5d6ff/Tffd700${Te6edf3sTb4b4b4.Te6edf3taskStatsTb4b4b4.Te6edf3totalTffd700}Ta5d6ff`
Tff7b72: Ta5d6ff"β"Tb4b4b4;
Te6edf3linesTb4b4b4.Te6edf3pushTb4b4b4(
Ta5d6ff`Ta5d6ff| Tffd700${Te6edf3sTb4b4b4.Te6edf3idTffd700}Ta5d6ff | Tffd700${Te6edf3sTb4b4b4.Te6edf3hasSpec Tff7b72? Ta5d6ff"β" Tff7b72: Ta5d6ff"β"Tffd700}Ta5d6ff | Tffd700${Te6edf3sTb4b4b4.Te6edf3hasPlan Tff7b72? Ta5d6ff"β" Tff7b72: Ta5d6ff"β"Tffd700}Ta5d6ff | Tffd700${Te6edf3sTb4b4b4.Te6edf3hasTasks Tff7b72? Ta5d6ff"β" Tff7b72: Ta5d6ff"β"Tffd700}Ta5d6ff | Tffd700${Te6edf3progressTffd700}Ta5d6ff |Ta5d6ff`Tb4b4b4,
Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Te6edf3linesTb4b4b4.Te6edf3pushTb4b4b4(
Ta5d6ff"\n## Workflow Commands"Tb4b4b4,
Ta5d6ff"specify β clarify β plan β tasks β analyze β implement"Tb4b4b4,
Ta5d6ff"\nUse `/speckit.specify` to start a new feature, or `speckit_load` to review an existing one."Tb4b4b4,
Tb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3linesTb4b4b4.Te6edf3joinTb4b4b4(Ta5d6ff"\n"Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Te6edf3hooksTff7b72: Tb4b4b4{
Te6edf3onSessionStartTff7b72: Tff7b72async Tb4b4b4(Tb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3specs Tff7b72= Tff7b72await Te6edf3discoverSpecsTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3specsTb4b4b4.Te6edf3length Tff7b72=== T79c0ff0Tb4b4b4) Tff7b72returnTb4b4b4;
Tff7b72const Te6edf3summary Tff7b72= Te6edf3specs
Tb4b4b4.Te6edf3mapTb4b4b4(Tb4b4b4(Te6edf3sTb4b4b4) Tb4b4b4=> Tb4b4b4{
Tff7b72const Te6edf3progress Tff7b72= Te6edf3sTb4b4b4.Te6edf3taskStats
Tff7b72? Ta5d6ff`Ta5d6ff (Tffd700${Te6edf3sTb4b4b4.Te6edf3taskStatsTb4b4b4.Te6edf3doneTffd700}Ta5d6ff/Tffd700${Te6edf3sTb4b4b4.Te6edf3taskStatsTb4b4b4.Te6edf3totalTffd700}Ta5d6ff tasks)Ta5d6ff`
Tff7b72: Ta5d6ff""Tb4b4b4;
Tff7b72return Ta5d6ff`Ta5d6ff- Tffd700${Te6edf3sTb4b4b4.Te6edf3idTffd700}Ta5d6ff: Tffd700${Te6edf3sTb4b4b4.Te6edf3titleTffd700}Tffd700${Te6edf3progressTffd700}Ta5d6ff`Tb4b4b4;
Tb4b4b4}Tb4b4b4)
Tb4b4b4.Te6edf3joinTb4b4b4(Ta5d6ff"\n"Tb4b4b4)Tb4b4b4;
Tff7b72return Tb4b4b4{
Te6edf3additionalContextTff7b72: Tb4b4b4[
Ta5d6ff`Ta5d6ff[Spec Kit] Tffd700${Te6edf3specsTb4b4b4.Te6edf3lengthTffd700}Ta5d6ff feature spec(s) found in specs/:Ta5d6ff`Tb4b4b4,
Te6edf3summaryTb4b4b4,
Ta5d6ff""Tb4b4b4,
Ta5d6ff"Use speckit_list, speckit_load, speckit_status, or speckit_constitution tools for spec details."Tb4b4b4,
Ta5d6ff"Use /speckit.specify, /speckit.plan, /speckit.tasks, /speckit.analyze, /speckit.implement for workflow commands."Tb4b4b4,
Tb4b4b4]Tb4b4b4.Te6edf3joinTb4b4b4(Ta5d6ff"\n"Tb4b4b4)Tb4b4b4,
Tb4b4b4}Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Served by rngit 1.5.2 - Generated in 0.13s